Latviešu

Apgūstiet React kļūdu robežas, lai veidotu noturīgas un lietotājam draudzīgas lietojumprogrammas. Uzziniet labāko praksi, ieviešanas metodes un uzlabotas kļūdu apstrādes stratēģijas.

React Kļūdu robežas: Elegantas kļūdu apstrādes metodes izturīgām lietojumprogrammām

Dinamiskajā tīmekļa izstrādes pasaulē izturīgu un lietotājam draudzīgu lietojumprogrammu izveide ir ārkārtīgi svarīga. React, populāra JavaScript bibliotēka lietotāja interfeisu veidošanai, nodrošina jaudīgu mehānismu kļūdu elegantai apstrādei: Kļūdu robežas. Šī visaptverošā rokasgrāmata iedziļinās Kļūdu robežu jēdzienā, izskaidrojot to mērķi, ieviešanu un labāko praksi izturīgu React lietojumprogrammu veidošanā.

Izpratne par nepieciešamību pēc kļūdu robežām

React komponentes, tāpat kā jebkurš kods, ir pakļautas kļūdām. Šīs kļūdas var rasties no dažādiem avotiem, tostarp:

Bez pienācīgas kļūdu apstrādes kļūda React komponentē var izraisīt visas lietojumprogrammas avāriju, kā rezultātā rodas slikta lietotāja pieredze. Kļūdu robežas nodrošina veidu, kā šīs kļūdas notvert un novērst to izplatīšanos pa komponentu koku, nodrošinot, ka lietojumprogramma paliek funkcionāla pat tad, ja atsevišķas komponentes sabrūk.

Kas ir React kļūdu robežas?

Kļūdu robežas ir React komponentes, kas uztver JavaScript kļūdas jebkurā to bērnu komponentu kokā, reģistrē tās kļūdas un parāda pagaidu lietotāja interfeisu komponentu koka vietā, kas sabruka. Tās darbojas kā drošības tīkls, neļaujot kļūdām izraisīt visas lietojumprogrammas avāriju.

Galvenās Kļūdu robežu īpašības:

Kļūdu robežu ieviešana

Pastaigāsimies pa pamata Kļūdu robežas komponentes izveides procesu:

1. Kļūdu robežas komponentes izveide

Vispirms izveidojiet jaunu klases komponenti, piemēram, ar nosaukumu ErrorBoundary:


import React from 'react';

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false
    };
  }

  static getDerivedStateFromError(error) {
    // Atjaunojiet stāvokli, lai nākamā renderēšana parādītu pagaidu lietotāja interfeisu.
    return {
      hasError: true
    };
  }

  componentDidCatch(error, errorInfo) {
    // Jūs varat arī reģistrēt kļūdu kļūdu ziņošanas pakalpojumā
    console.error("Uztverta kļūda: ", error, errorInfo);
    // Piemērs: logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // Jūs varat renderēt jebkuru pielāgotu pagaidu lietotāja interfeisu
      return (
        <div>
          <h2>Kaut kas nogāja greizi.</h2>
          <details style={{ whiteSpace: 'pre-wrap' }}>
            {this.state.error && this.state.error.toString()}
            <br />
            {this.state.errorInfo.componentStack}
          </details>
        </div>>
      );
    }

    return this.props.children; 
  }
}

export default ErrorBoundary;

Skaidrojums:

2. Kļūdu robežas izmantošana

Lai izmantotu Kļūdu robežu, vienkārši iesaiņojiet jebkuru komponentu, kas var izraisīt kļūdu, ar ErrorBoundary komponenti:


import ErrorBoundary from './ErrorBoundary';

function MyComponent() {
  // Šī komponenta var izraisīt kļūdu
  return (
    <ErrorBoundary>
      <PotentiallyBreakingComponent />
    </ErrorBoundary>>
  );
}

export default MyComponent;

Ja PotentiallyBreakingComponent izraisīs kļūdu, ErrorBoundary to uztvers, reģistrēs kļūdu un renderēs pagaidu lietotāja interfeisu.

3. Ilustratīvi piemēri ar globālu kontekstu

Apsveriet e-komercijas lietojumprogrammu, kas parāda produktu informāciju, kas iegūta no attālās servera. Komponente ProductDisplay ir atbildīga par produktu detaļu renderēšanu. Tomēr serveris laiku pa laikam var atgriezt negaidītus datus, radot renderēšanas kļūdas.


// ProductDisplay.js
import React from 'react';

function ProductDisplay({ product }) {
  // Simulēt iespējamu kļūdu, ja product.price nav skaitlis
  if (typeof product.price !== 'number') {
    throw new Error('Nederīgs produktu cenu');
  }

  return (
    <div>
      <h2>{product.name}</h2>
      <p>Cena: {product.price}</p>
      <img src={product.imageUrl} alt={product.name} />
    </div>>
  );
}

export default ProductDisplay;

Lai pasargātu no šādām kļūdām, iesaiņojiet ProductDisplay komponenti ar ErrorBoundary:


// App.js
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import ProductDisplay from './ProductDisplay';

function App() {
  const product = {
    name: 'Piemēra produkts',
    price: 'Nav skaitlis', // Apzināti nepareizi dati
    imageUrl: 'https://example.com/image.jpg'
  };

  return (
    <div>
      <ErrorBoundary>
        <ProductDisplay product={product} />
      </ErrorBoundary>
    </div>>
  );
}

export default App;

Šajā scenārijā, tā kā product.price ir apzināti iestatīts kā virkne, nevis skaitlis, ProductDisplay komponente izraisīs kļūdu. ErrorBoundary uztvers šo kļūdu, neļaus sabrukt visai lietojumprogrammai un parādīs pagaidu lietotāja interfeisu bojātās ProductDisplay komponentes vietā.

4. Kļūdu robežas starptautiskotās lietojumprogrammās

Veidojot lietojumprogrammas globālai auditorijai, kļūdu ziņojumiem ir jābūt lokalizētiem, lai nodrošinātu labāku lietotāja pieredzi. Kļūdu robežas var izmantot kopā ar internacionālas (i18n) bibliotēkām, lai parādītu tulkotus kļūdu ziņojumus.


// ErrorBoundary.js (ar i18n atbalstu)
import React from 'react';
import { useTranslation } from 'react-i18next'; // Pieņemot, ka izmantojat react-i18next

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
      error: null,
      errorInfo: null,
    };
  }

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
      error: error,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Uztverta kļūda: ", error, errorInfo);
    this.setState({errorInfo: errorInfo});
  }

  render() {
    if (this.state.hasError) {
      return (
        <FallbackUI error={this.state.error} errorInfo={this.state.errorInfo}/>
      );
    }

    return this.props.children;
  }
}

const FallbackUI = ({error, errorInfo}) => {
  const { t } = useTranslation();

  return (
    <div>
      <h2>{t('error.title')}</h2>
      <p>{t('error.message')}</p>
      <details style={{ whiteSpace: 'pre-wrap' }}>
        {error && error.toString()}<br />
        {errorInfo?.componentStack}
      </details>
    </div>>
  );
}


export default ErrorBoundary;

Šajā piemērā mēs izmantojam react-i18next, lai tulkotu kļūdas virsrakstu un ziņojumu pagaidu lietotāja interfeisā. t('error.title') un t('error.message') funkcijas iegūs atbilstošos tulkojumus, pamatojoties uz lietotāja izvēlēto valodu.

5. Apsvērumi servera renderēšanai (SSR)

Izmantojot Kļūdu robežas servera renderētās lietojumprogrammās, ir ļoti svarīgi pienācīgi apstrādāt kļūdas, lai novērstu servera avāriju. React dokumentācija iesaka izvairīties no Kļūdu robežu izmantošanas, lai atgūtos no renderēšanas kļūdām serverī. Tā vietā apstrādājiet kļūdas pirms komponentes renderēšanas vai renderējiet statisku kļūdas lapu serverī.

Labākā prakse Kļūdu robežu izmantošanai

Papildu kļūdu apstrādes stratēģijas

1. Mēģinājumu mehānismi

Dažos gadījumos var būt iespējams atgūties no kļūdas, mēģinot vēlreiz veikt operāciju, kas to izraisīja. Piemēram, ja tīkla pieprasījums neizdodas, varat mēģināt vēlreiz pēc īsas kavēšanās. Kļūdu robežas var apvienot ar mēģinājumu mehānismiem, lai nodrošinātu noturīgāku lietotāja pieredzi.


// ErrorBoundaryWithRetry.js
import React from 'react';

class ErrorBoundaryWithRetry extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
      retryCount: 0,
    };
  }

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Uztverta kļūda: ", error, errorInfo);
  }

  handleRetry = () => {
    this.setState(prevState => ({
      hasError: false,
      retryCount: prevState.retryCount + 1,
    }), () => {
      // Tas piespiež komponenti vēlreiz renderēt. Apsveriet labākus modeļus ar kontrolētām rekvizītiem.
      this.forceUpdate(); // BRĪDINĀJUMS: Lietot ar piesardzību
      if (this.props.onRetry) {
          this.props.onRetry();
      }
    });
  };

  render() {
    if (this.state.hasError) {
      return (
        <div>
          <h2>Kaut kas nogāja greizi.</h2>
          <button onClick={this.handleRetry}>Mēģināt vēlreiz</button>
        </div>>
      );
    }

    return this.props.children;
  }
}

export default ErrorBoundaryWithRetry;

ErrorBoundaryWithRetry komponente ietver mēģinājuma pogu, kas, noklikšķinot, atiestata hasError stāvokli un vēlreiz renderē bērnu komponentes. Varat arī pievienot retryCount, lai ierobežotu mēģinājumu skaitu. Šī pieeja var būt īpaši noderīga, lai apstrādātu īslaicīgas kļūdas, piemēram, pagaidu tīkla pārtraukumus. Pārliecinieties, ka onRetry rekvizīts tiek pienācīgi apstrādāts un atkārtoti pieprasa/atkārtoti izpilda loģiku, kas, iespējams, kļūdījās.

2. Funkciju karodziņi

Funkciju karodziņi ļauj dinamiski ieslēgt vai izslēgt funkcijas jūsu lietojumprogrammā, neizlaižot jaunu kodu. Kļūdu robežas var izmantot kopā ar funkciju karodziņiem, lai nodrošinātu funkciju elegantu degradāciju kļūdas gadījumā. Piemēram, ja noteikta funkcija izraisa kļūdas, varat to atspējot, izmantojot funkciju karodziņu, un parādīt lietotājam ziņojumu, ka funkcija pagaidām nav pieejama.

3. Cirkuitu pārtraucēja modelis

Cirkuitu pārtraucēja modelis ir programmatūras dizaina modelis, ko izmanto, lai neļautu lietojumprogrammai atkārtoti mēģināt izpildīt operāciju, kas, visticamāk, neizdosies. Tā darbojas, uzraugot operācijas veiksmes un kļūmju rādītājus un, ja kļūmju rādītājs pārsniedz noteiktu slieksni, “atverot ķēdi” un neļaujot turpmākiem mēģinājumiem izpildīt operāciju noteiktu laiku. Tas var palīdzēt novērst kaskadējošās kļūdas un uzlabot lietojumprogrammas kopējo stabilitāti.

Kļūdu robežas var izmantot, lai ieviestu cirkuitu pārtraucēja modeli React lietojumprogrammās. Kad Kļūdu robeža uztver kļūdu, tā var palielināt kļūmju skaitītāju. Ja kļūmju skaitītājs pārsniedz slieksni, Kļūdu robeža var parādīt lietotājam ziņojumu, ka funkcija pagaidām nav pieejama, un neļaut turpmākus mēģinājumus izpildīt operāciju. Pēc noteikta laika Kļūdu robeža var “aizvērt ķēdi” un vēlreiz ļaut mēģināt izpildīt operāciju.

Secinājums

React Kļūdu robežas ir neatņemams rīks izturīgu un lietotājam draudzīgu lietojumprogrammu veidošanai. Ieviešot Kļūdu robežas, varat novērst kļūdu izraisīšanu visas lietojumprogrammas avārijai, nodrošināt lietotājiem elegantu pagaidu lietotāja interfeisu un reģistrēt kļūdas uzraudzības pakalpojumiem atkļūdošanai un analīzei. Ievērojot labāko praksi un papildu stratēģijas, kas izklāstītas šajā rokasgrāmatā, jūs varat izveidot React lietojumprogrammas, kas ir noturīgas, uzticamas un nodrošina pozitīvu lietotāja pieredzi pat negaidītu kļūdu gadījumā. Atcerieties koncentrēties uz informatīvu kļūdu ziņojumu sniegšanu, kas ir lokalizēts globālai auditorijai.